package entity;

import java.util.ArrayList;
import java.util.List;

public class SevPile extends PokerPile {
	public SevPile(List<Poker> list) {
		if(!list.isEmpty())	//如果传入非空
			list.get(list.size()-1).setUp(true);//最后一张牌应该正面朝上
		this.pokerList=list;
		
	}
	/**判断tail后面能不能接head
	 * 
	 * @param tail	第一个牌堆的尾巴
	 * @param head	第二个牌堆的头部
	 * @return
	 */
	private boolean canContinue(Poker tail,Poker head){
		/*首先，tail和head颜色必须是不同的
		 * 其次，tail的数字-1必须等于head的数字*/
		if(Poker.suit2Color.get(tail.getSuit())==Poker.suit2Color.get(head.getSuit()))//如果花色相同
			return false;//不能接
		return tail.getNumber()-1==head.getNumber();//判断tail下一张应接的牌是否为head
	}
	@Override
	public boolean put(List<Poker> pokers) {
		//System.out.println(pokers);
		if(pokerList.isEmpty()){	//如果当前牌堆里面没有牌	
			if(pokers!=null&&!pokers.isEmpty()&&pokers.get(0).getNumber()==13){//如果要放入的牌的最上层为K
			putBack(pokers);
			return true;
			}
			return false;
		}
		if(pokers==null||pokers.isEmpty())
			return false;
		Poker tail=pokerList.get(pokerList.size()-1);//获取源牌堆的最后一张牌
		Poker head=pokers.get(0);//获取欲放入牌堆的第一张牌
		if(!pokerList.isEmpty()&&!canContinue(tail, head))	//如果牌堆不为空并且不可以接下去
			return false;
		putBack(pokers);//把所有牌直接加入牌组
		//pokerList.addAll(pokers);	
		return true;
	}

	@Override
	public List<Poker> get(int no) {
		if(no>=pokerList.size())
			return null;
		for(int i=no;i<pokerList.size()-1;i++){	//遍历从no之后的牌
			if(!pokerList.get(i).isUp()||!canContinue(pokerList.get(i), pokerList.get(i+1)))	//如果发现了不连续的或者未翻开的牌
				return null;
		}
		List<Poker> res=pokerList.subList(no, pokerList.size());//将no之后的牌赋给返回结果
		List<Poker> tempList=new ArrayList<>();
		//System.out.println("no is "+no);
		for(Poker poker:pokerList.subList(0, no)){
			tempList.add(poker);
		}
		pokerList=tempList;
		return res;
	}
	/**翻过顶部的牌
	 * 
	 */
	public void changeTopPoker(){
		if(pokerList.isEmpty())
			return;
		pokerList.get(pokerList.size()-1).setUp(true);;//设置顶部扑克正面朝上
	}
	/**根据难度来放牌
	 * 
	 * @param pokers 要放的牌
	 * @param level 难度等级
	 * @return
	 */
	public boolean put(List<Poker> pokers,int level){
		if(level<2&&(pokerList==null||pokerList.isEmpty())){//如果难度等级小于2并且没有牌
			putBack(pokers);
			return true;
		}
		return put(pokers);
	}
}
